package com.xoom.oss.feathercon; import org.eclipse.jetty.servlet.DefaultServlet; import org.junit.After; import org.junit.Before; import org.junit.Test; import javax.servlet.DispatcherType; import javax.websocket.CloseReason; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import java.io.File; import java.util.EnumSet; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.core.IsNull.notNullValue; import static org.hamcrest.core.IsNull.nullValue; public class FeatherConTest extends BaseTest { FeatherCon.Builder builder; @Before public void setUp() throws Exception { builder = new FeatherCon.Builder(); } @After public void tearDown() throws Exception { } @Test public void testWithPort() throws Exception { int port = 8080; builder.withPort(port); builder.withPort(port); assertThat(builder.port, equalTo(port)); } @Test public void testWithServletContextAttribute() throws Exception { assertThat(builder.servletContextAttributes, is(notNullValue())); Object object = new Object(); String key = "k1"; builder.withServletContextAttribute(key, object); assertThat(builder.servletContextAttributes.containsKey(key), equalTo(true)); assertThat(builder.servletContextAttributes.get(key), equalTo(object)); } @Test public void testWithServletContextListener() throws Exception { assertThat(builder.servletContextListeners, is(notNullValue())); assertThat(builder.servletContextListeners.size(), equalTo(0)); ContextListener servletContextListener = new ContextListener(); builder.withServletContextListener(servletContextListener); assertThat(builder.servletContextListeners.contains(servletContextListener), equalTo(true)); assertThat(builder.servletContextListeners.size(), equalTo(1)); } @Test public void testWithInitParameter() throws Exception { String key = "k1"; String value = "v1"; assertThat(builder.initParameters, is(notNullValue())); builder.withInitParameter(key, value); assertThat(builder.initParameters.size(), equalTo(1)); assertThat(builder.initParameters.containsKey(key), equalTo(true)); assertThat(builder.initParameters.get(key), equalTo(value)); } @Test public void testWithFilter() throws Exception { EnumSet<DispatcherType> dispatcherTypes = EnumSet.allOf(DispatcherType.class); FilterWrapper.Builder filterBuilderA = new FilterWrapper.Builder(); filterBuilderA .withFilterClass(FilterA.class) .withPathSpec("/css/*") .withPathSpec("/js/*") .withDispatcherTypeSet(dispatcherTypes); FilterWrapper filterWrapperA = filterBuilderA.build(); builder.withFilter(filterWrapperA); FilterWrapper.Builder filterBuilderB = new FilterWrapper.Builder(); filterBuilderB .withFilterClass(FilterB.class) .withPathSpec("/apiv1/*") .withPathSpec("/apiv2/*") .withDispatcherTypeSet(dispatcherTypes); FilterWrapper filterWrapperB = filterBuilderB.build(); builder.withFilter(filterWrapperB); assertThat(builder.filters.contains(filterWrapperA), equalTo(true)); assertThat(builder.filters.contains(filterWrapperB), equalTo(true)); } @Test public void testWithServletConfiguration() throws Exception { assertThat(builder.servletConfigurations, is(notNullValue())); assertThat(builder.servletConfigurations.size(), equalTo(0)); ServletConfiguration.Builder servletConfigBuilder = new ServletConfiguration.Builder(); servletConfigBuilder.withServletClass(DefaultServlet.class) .withServletName("superServlet") .withInitOrder(1) .withInitParameter("k1", "v1") .withPathSpec("/css/*") .withPathSpec("/js/*"); ServletConfiguration servletConfiguration = servletConfigBuilder.build(); builder.withServletConfiguration(servletConfiguration); assertThat(builder.servletConfigurations.size(), equalTo(1)); assertThat(builder.servletConfigurations.contains(servletConfiguration), equalTo(true)); } @Test public void testWithContextName() throws Exception { String contextName = "mywebapp"; builder.withContextName(contextName); assertThat(builder.contextName, equalTo(contextName)); } @Test public void testWithSSL() throws Exception { SSLConfiguration sslConfiguration = new SSLConfiguration.Builder(). withKeyStoreFile(new File("src/test/resources/keystore.jks")) .withKeyStorePassword("changeit") .withSslPort(8443) .withSslOnly(true).build(); builder.withSslConfiguration(sslConfiguration); assertThat(sslConfiguration, equalTo(builder.sslConfiguration)); FeatherCon server = builder.build(); server.start(); assertThat(server.getHttpPort(), is(nullValue())); assertThat(8443, equalTo(server.getHttpsPort())); } @Test public void testWithSSLEphemeralPort() throws Exception { SSLConfiguration sslConfiguration = new SSLConfiguration.Builder(). withKeyStoreFile(new File("src/test/resources/keystore.jks")) .withKeyStorePassword("changeit") .withSslPort(0) .withSslOnly(true).build(); builder.withSslConfiguration(sslConfiguration); assertThat(sslConfiguration, equalTo(builder.sslConfiguration)); FeatherCon server = builder.build(); server.start(); assertThat(server.getHttpPort(), is(nullValue())); assertThat(server.getHttpsPort() > 0, equalTo(true)); } @Test public void testBuild() throws Exception { assertThat(this.builder.servletConfigurations, is(notNullValue())); assertThat(this.builder.servletConfigurations.size(), equalTo(0)); ServletConfiguration.Builder servletConfigBuilder = new ServletConfiguration.Builder(); servletConfigBuilder.withServletClass(DefaultServlet.class) .withServletName("superServlet") .withInitOrder(1) .withInitParameter("k1", "v1") .withPathSpec("/css/*") .withPathSpec("/js/*"); ServletConfiguration servletConfiguration = servletConfigBuilder.build(); this.builder.withServletConfiguration(servletConfiguration); assertThat(this.builder.servletConfigurations.size(), equalTo(1)); assertThat(this.builder.servletConfigurations.contains(servletConfiguration), equalTo(true)); String contextName = "mywebapp"; this.builder.withContextName(contextName); Object contextObject = new Object(); String contextAttributeKey = "key"; this.builder.withServletContextAttribute(contextAttributeKey, contextObject); this.builder.withInitParameter("k1", "v1"); this.builder.withServletContextListener(new ContextListener()); this.builder.withServletContextListener("com.xoom.oss.feathercon.ContextListener"); EnumSet<DispatcherType> dispatcherTypes = EnumSet.allOf(DispatcherType.class); FilterWrapper.Builder builder = new FilterWrapper.Builder(); builder.withFilterClass(FilterA.class).withPathSpec("/apiv1/*").withPathSpec("/apiv2/*").withDispatcherTypeSet(dispatcherTypes); this.builder.withFilter(builder.build()); FeatherCon build = this.builder.build(); assertThat(build.contextName, equalTo(contextName)); assertThat(build.port, equalTo(8080)); assertThat(build.servletContextAttributes, is(notNullValue())); assertThat(build.servletContextAttributes.containsKey(contextAttributeKey), equalTo(true)); assertThat(build.servletContextAttributes.get(contextAttributeKey), equalTo(contextObject)); } @Test public void testToString() throws Exception { builder.toString(); builder.build().toString(); } @Test(expected = IllegalStateException.class) public void testBuiltTwice() throws Exception { builder.build(); builder.build(); } @Test public void testWebSocketConfiguration() throws Exception { WebSocketEndpointConfiguration.Builder webSocketBuilder = new WebSocketEndpointConfiguration.Builder(); webSocketBuilder.withEndpointClass(MyEndPoint.class); WebSocketEndpointConfiguration webSocketConfig = webSocketBuilder.build(); builder.withWebSocketConfiguration(webSocketConfig); FeatherCon server = builder.build(); } @ServerEndpoint(value = "/events/") private class MyEndPoint { @OnOpen public void onWebSocketConnect(Session sess) { } @OnMessage public void onWebSocketText(String message) { } @OnClose public void onWebSocketClose(CloseReason reason) { } @OnError public void onWebSocketError(Throwable cause) { } } }